(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

Gravando dados em tempo de execução e os reproduzindo posteriormente

Description: Este tutorial possui o objetivo de orientá-lo na gravação dos dados gerados durante a execução de uma aplicação ROS em arquivos .bag. Assim como, na reprodução posterior destes dados com o intuito de representar o estado do sistema no momento da gravação.

Keywords: dados, .bag, gravação, reprodução, execução, posterior

Tutorial Level: BEGINNER

Next Tutorial: Getting started with roswtf

Gravação de dados (criando um arquivo bag)

Esta seção descreverá as etapas necessárias para a gravação dos dados oriundos de um tópico ativo no ROS. Os dados publicados no tópico serão armazenados em um arquivo bag.

Primeiro,execute os seguintes comandos em terminais distintos:

Terminal 1:

roscore

Terminal 2:

rosrun turtlesim turtlesim_node

Terminal 3:

rosrun turtlesim turtle_teleop_key

Esta ação iniciará dois nós ("nodes"), o simulador turtlesim e o nó que permite o controle da tartaruga por meio das setas direcionais do teclado. Se você selecionar a tela do terminal na qual o nó turtle_keyboard foi lançado, a saída deverá ser análoga ao seguinte trecho:

Reading from keyboard
---------------------------
Use arrow keys to move the turtle.

O uso das teclas direcionais do teclado fará com que a tartaruga se mova de forma correspondente. Observe que para mover a tartaruga você deve ter o terminal no qual o nó turtlesim foi lançado e não a janela do simulador.

Gravando todos os tópicos sendo publicados

Antes de tudo, vamos examinar a lista completa de tópicos ativos no momento, ou seja, os tópicos que estão em execução para a aplicação atual. Para isso, abra uma nova janela de terminal e execute:

rostopic list -v

O que deve gerar a seguinte saída:

Published topics:
 * /turtle1/color_sensor [turtlesim/Color] 1 publisher
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
 * /rosout [rosgraph_msgs/Log] 2 publishers
 * /rosout_agg [rosgraph_msgs/Log] 1 publisher
 * /turtle1/pose [turtlesim/Pose] 1 publisher

Subscribed topics:
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber
 * /rosout [rosgraph_msgs/Log] 1 subscriber

A lista dos tópicos que estão sendo publicados demonstra quais são as respectivas mensagens específicas que poderiam ser gravadas no arquivo de registro (.bag). O tópico /turtle1/cmd_vel é responsável pelas mensagens de comando que são publicadas pelo nó teleop_turtle, no qual é passado como entrada para o nó responsável pela definição do comportamento da tartaruga. As mensagens /turtle1/color_sensor e /turtle1/pose são mensagens de saída publicadas pelo simulador turtlesim.

Agora, vamos gravar os dados que estão sendo publicados na aplicação atual. Abra uma nova janela de terminal. Nesta janela, execute os seguintes comandos:

mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a

Com os comandos executados acima, criamos um diretório temporário para armazenar os arquivos de dados gerados. Com o comando rosbag record seguido da opção -a, indicamos que todos os tópicos que estão sendo publicados na aplicação atual devem ser acumulados em um único arquivo de dados (.bag).

Retorne ao terminal que possui o nó turtle_teleop em execução e mova a tartaruga por alguns segundos. Na janela com o rosbag record execução, interrompa a gravação com o comando Ctrl-C. Agora, examine o conteúdo que deve estar presente no diretório ~/bagfiles. Você deve encontrar um arquivo nomeado com o ano, data e horário, seguido do sufixo .bag. Esse é o arquivo bag que contém todos os dados dos tópicos que estavam sendo publicados pelos nós disponíveis, no momento da gravação, ou seja, durante a execução do comando rosbag record.

Analisando e reproduzindo o arquivo bag

Agora, que realizamos a gravação do arquivo bag usando o comando rosbag record, estamos aptos para a reprodução do conteúdo e a para a posterior análise dos dados gravados, usando os comandos rosbag play e rosbag info, respectivamente. Primeiro, vamos checar o conteúdo gravado no arquivo bag. Para isso, executamos o comando info, o qual checa o conteúdo do bag sem executá-lo. Execute o comando a seguir do diretório ~/bagfiles:

rosbag info <your bagfile>

A saída esperada:

path:        2014-12-10-20-08-34.bag
version:     2.0
duration:    1:38s (98s)
start:       Dec 10 2014 20:08:35.83 (1418270915.83)
end:         Dec 10 2014 20:10:14.38 (1418271014.38)
size:        865.0 KB
messages:    12471
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             rosgraph_msgs/Log   [acffd30cd6b6de30f120938c17c593fb]
             turtlesim/Color     [353891e354491c51aabe32df673fb446]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /rosout                    4 msgs    : rosgraph_msgs/Log   (2 connections)
             /turtle1/cmd_vel         169 msgs    : geometry_msgs/Twist
             /turtle1/color_sensor   6149 msgs    : turtlesim/Color
             /turtle1/pose           6149 msgs    : turtlesim/Pose

A saída nos fornece informações relacionadas ao nome dos tópicos, tipos e quantidade de mensagens salvas por cada tópico gravado. Podemos observar que dos tópicos listados anteriormente pelo comando rostopic, quatro dos cinco receberam publicações durante a gravação do arquivo bag. Como executamos rosbag record com a opção -a, todos os tópicos que receberam publicações durante o período de gravação tiveram o conteúdo das respectivas mensagens armazenado. O próximo passo deste tutorial é reproduzir o conteúdo gravado no arquivo bag, com o intuito de representar o estado da aplicação no momento da gravação. Primeiro, encerre a execução do nó turtle_teleop_key, que realiza o controle da tartaruga pelo teclado, para isso pressione as teclas Ctrl-C no terminal em questão. Mantendo o simulador turtlesim em execução, em um novo terminal, execute o seguinte comando no diretório no qual o bag foi gerado, de acordo com este tutorial ~/bagfiles:

rosbag play <your bagfile>

Nessa janela a saída esperada é:

[ INFO] [1418271315.162885976]: Opening 2014-12-10-20-08-34.bag

Waiting 0.2 seconds after advertising topics... done.

Hit space to toggle paused, or 's' to step.

Em seu modo padrão, o rosbag play aguarda um certo período (0,2 segundos) após anunciar cada mensagem antes de começar a publicar o conteúdo do arquivo bag. Aguardar algum tempo permite que qualquer assinante de uma mensagem seja alertado de que a mensagem foi anunciada e que as mensagens podem seguir. Se rosbag play publica mensagens imediatamente após o anúncio, os assinantes podem não receber as primeiras várias mensagens publicadas. O período de espera pode ser especificado com a opção -d.

Eventualmente, o tópico/turtle1/cmd_vel será publicado e a tartaruga deve começar a se mover no simulador turtlesim em um padrão semelhante ao que você executou no programa de teleop. A duração entre executar o rosbag play e o movimento da tartaruga deve ser aproximadamente igual ao tempo entre a execução original do rosbag record emitir os comandos do teclado na parte inicial do tutorial. Você pode fazer com que o rosbag play não inicie no início do arquivo bag, mas inicie em um período além do início usando o argumento -s. Uma opção final que pode ser interessante é a opção -r, que permite alterar a taxa de publicação por um fator especificado. Se você executar:

rosbag play -r 2 <your bagfile>

Você deve ver a tartaruga executando uma trajetória ligeiramente diferente - essa é a trajetória que teria resultado se você tivesse emitido os comandos do teclado duas vezes mais rápido.

Gravando apenas uma porção dos dados gerados

Ao executar um sistema complexo, como o pacote de software pr2, pode haver centenas de tópicos sendo publicados, com alguns tópicos, como fluxos de imagens da câmera, publicando potencialmente grandes quantidades de dados. Nesse sistema, geralmente é impraticável gravar arquivos de dados que consistem em todos os tópicos da aplicação em um único arquivo bag. O comando rosbag record suporta o registro apenas de tópicos específicos em um arquivo bag, permitindo que os usuários registrem apenas os tópicos de interesse para eles.

Se algum nó do Turtlesim estiver em execução, saia deles e reinicie o arquivo launch do nó que comanda a tartaruga por meio das teclas direcionais do teclado, o teleop_turtle:

rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key

No diretório de bags, execute o seguinte comando:

rosbag record -O subset /turtle1/cmd_vel /turtle1/pose

O argumento -O diz ao rosbag record para registrar os dados gravados em um arquivo chamado subset.bag, e os argumentos do tópico fazem com que o rosbag record se inscreva apenas nesses dois tópicos. Mova a tartaruga por alguns segundos usando os comandos de seta do teclado e, em seguida, pressione Ctrl-C no terminal do registro de rosbag.

Agora verifique o conteúdo do arquivo bag (rosbag info subset.bag). Você deve ver algo assim, com apenas os tópicos indicados:

path:        subset.bag
version:     2.0
duration:    12.6s
start:       Dec 10 2014 20:20:49.45 (1418271649.45)
end:         Dec 10 2014 20:21:02.07 (1418271662.07)
size:        68.3 KB
messages:    813
compression: none [1/1 chunks]
types:       geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
             turtlesim/Pose      [863b248d5016ca62ea2e895ae5265cf9]
topics:      /turtle1/cmd_vel    23 msgs    : geometry_msgs/Twist
             /turtle1/pose      790 msgs    : turtlesim/Pose

Limitações do rosbag record/play

Na seção anterior, você deve ter notado que o caminho da tartaruga pode não ter sido exatamente mapeado para a entrada original do teclado - a forma aproximada deveria ter sido a mesma, mas a tartaruga pode não ter seguido exatamente o mesmo caminho. A razão para isso é que o caminho rastreado pelo turtlesim é muito sensível a pequenas mudanças no tempo no sistema, e o rosbag é limitado em sua capacidade de duplicar exatamente o comportamento de um sistema em execução em termos de quando as mensagens são gravadas e processadas pelo rosrecord , e quando as mensagens são produzidas e processadas ao usar o rosplay. Para nós como o turtlesim, onde pequenas mudanças de tempo no processamento de mensagens de comando podem alterar sutilmente o comportamento, o usuário não deve esperar um comportamento perfeitamente imitado.

Agora que você aprendeu a gravar e reproduzir dados, vamos aprender como troubleshoot with roswtf.

Wiki: pt_BR/ROS/Tutorials/Recording and playing back data (last edited 2020-04-20 14:09:40 by henriquePoleselo)